package com.arpnetworking.utils.models;
import com.avaje.ebean.bean.BeanCollection;
import com.avaje.ebean.common.BeanList;
import com.avaje.ebean.event.BeanFinder;
import com.avaje.ebean.event.BeanQueryRequest;
import com.avaje.ebean.meta.MetaQueryPlanStatistic;
import com.avaje.ebeaninternal.api.SpiEbeanServer;
import com.avaje.ebeaninternal.api.SpiQuery;
import com.avaje.ebeaninternal.server.deploy.BeanDescriptor;
import com.avaje.ebeaninternal.server.query.CQueryPlan;
import javax.persistence.PersistenceException;
import java.util.Iterator;
import java.util.List;
/**
* BeanFinder for MetaQueryStatistic.
*/
public class QueryStatisticFinder implements BeanFinder<MetaQueryPlanStatistic> {
public MetaQueryPlanStatistic find(BeanQueryRequest<MetaQueryPlanStatistic> request) {
throw new RuntimeException("Not Supported yet");
}
/**
* Only returns Lists at this stage.
*/
public BeanCollection<MetaQueryPlanStatistic> findMany(BeanQueryRequest<MetaQueryPlanStatistic> request) {
SpiQuery.Type queryType = ((SpiQuery<?>) request.getQuery()).getType();
if (!queryType.equals(SpiQuery.Type.LIST)) {
throw new PersistenceException("Only findList() supported at this stage.");
}
BeanList<MetaQueryPlanStatistic> list = new BeanList<MetaQueryPlanStatistic>();
SpiEbeanServer server = (SpiEbeanServer) request.getEbeanServer();
build(list, server);
String orderBy = request.getQuery().order().toStringFormat();
if (orderBy == null) {
orderBy = "beanType, origQueryPlanHash, autofetchTuned";
}
server.sort(list, orderBy);
return list;
}
private void build(List<MetaQueryPlanStatistic> list, SpiEbeanServer server) {
for (BeanDescriptor<?> desc : server.getBeanDescriptors()) {
build(list, desc);
}
}
private void build(List<MetaQueryPlanStatistic> list, BeanDescriptor<?> desc) {
Iterator<CQueryPlan> it = desc.queryPlans();
while (it.hasNext()) {
CQueryPlan queryPlan = it.next();
list.add(queryPlan.getSnapshot(false));
}
}
}